package com.lhb.beanLifecycle;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;

/**
 * @Program: spring
 * @Description:
 * @Author: LHB
 * @Version: v0.0.1
 * @Time: 2021-08-12 18:12
 **/
@ComponentScan(basePackages = {"com.lhb.beanLifecycle"})
public class BeanLifecycleStarter {
	public static void main(String[] args) {
		/**
		 * 实例化Bean对象，这个时候Bean的对象是非常低级的，基本不能够被我们使用，因为连最基本的属性都没有设置，可以理解为连Autowired注解都是没有解析的；
		 * 填充属性，当做完这一步，Bean对象基本是完整的了，可以理解为Autowired注解已经解析完毕，依赖注入完成了；
		 * 如果Bean实现了BeanNameAware接口，则调用setBeanName方法；
		 * 如果Bean实现了BeanClassLoaderAware接口，则调用setBeanClassLoader方法；
		 * 如果Bean实现了BeanFactoryAware接口，则调用setBeanFactory方法；
		 * 调用BeanPostProcessor的postProcessBeforeInitialization方法；
		 * 如果Bean实现了InitializingBean接口，调用afterPropertiesSet方法；
		 * 如果Bean定义了init-method方法，则调用Bean的init-method方法；
		 * 调用BeanPostProcessor的postProcessAfterInitialization方法；当进行到这一步，Bean已经被准备就绪了，一直停留在应用的上下文中，直到被销毁；
		 * 如果应用的上下文被销毁了，如果Bean实现了DisposableBean接口，则调用destroy方法，如果Bean定义了destory-method声明了销毁方法也会被调用。
		 */
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanLifecycleStarter.class);
		context.close();
	}
}
